#ifndef COMMAND_H
#define COMMAND_H

#include <string>
#include <vector>
#include <unordered_map>
#include <functional>
#include <mutex>
#include <pwd.h>
#include <grp.h>
#include <ctime>
#include <iomanip>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <cstring>
#include <sstream>
#include "logger.h"

class CommandHandler
{
public:
    using Handler = std::function<std::string(const std::vector<std::string> &)>;

    CommandHandler();
    ~CommandHandler();

    std::string process(const std::string &command);

    // 设置/获取当前工作目录
    void set_current_dir(const std::string &dir);
    std::string get_current_dir() const;
    std::string get_absolute_path(const std::string &path) const;

private:
    mutable std::mutex mutex_;
    std::unordered_map<std::string, Handler> handlers_;
    std::string current_dir_; // 当前工作目录

    // 辅助函数
    std::string get_directory_listing(const std::string &path);
    long get_dir_size(const std::string &path) const;

    // 命令处理函数
    std::string handle_list(const std::vector<std::string> &args);
    std::string handle_pwd(const std::vector<std::string> &args);
    std::string handle_cd(const std::vector<std::string> &args);
    std::string handle_mkdir(const std::vector<std::string> &args);
    std::string handle_rmdir(const std::vector<std::string> &args);
    std::string handle_delete(const std::vector<std::string> &args);
    std::string handle_help(const std::vector<std::string> &args);
    std::string handle_stat(const std::vector<std::string> &args);
    std::string handle_upload(const std::vector<std::string> &args);
    std::string handle_download(const std::vector<std::string> &args);
};

#endif // COMMAND_H